// src/utils/request.ts
import axios from 'axios';
import { useUserStore } from '@/stores/user';
import { ElMessage } from 'element-plus';

// 1. 定义免 Token 白名单（官网/电商平台常用场景）
// 格式：{ 接口路径: [允许的请求方法] }，方法大写（GET/POST/PUT/DELETE）
const NO_TOKEN_WHITE_LIST = {
  // 公开接口（无需登录即可访问）
  '/auth/login': ['POST'], // 登录
  '/auth/register': ['POST'], // 注册
  '/auth/forgot-password': ['POST'], // 忘记密码
  '/goods/list': ['GET'], // 商品列表（电商平台公开接口）
  '/goods/detail': ['GET'], // 商品详情（电商平台公开接口）
  '/home/banner': ['GET'], // 首页轮播（官网/电商平台公开）
  '/home/notice': ['GET'], // 首页公告（官网/电商平台公开）
  '/category/all': ['GET'], // 商品分类（电商平台公开）
  '/common/region': ['GET'], // 省市区选择（公开）
  '/common/captcha': ['GET'], // 验证码（公开）
};

// 创建 Axios 实例
const service = axios.create({
  baseURL: import.meta.env.VITE_API_BASE_URL,
  timeout: 10000,
  headers: {
    'Content-Type': 'application/json;charset=utf-8',
  },
});

// 请求拦截器：智能判断是否携带 Token
service.interceptors.request.use(
  (config) => {
    const userStore = useUserStore();
    // 2. 解析当前请求的「路径」和「方法」
    const requestPath = config.url?.replace(config.baseURL || '', '') || ''; // 拿到相对路径（如 /auth/login）
    const requestMethod = config.method?.toUpperCase() || 'GET';

    // 3. 判断是否在免 Token 白名单中
    const isWhiteList = NO_TOKEN_WHITE_LIST[requestPath]?.includes(requestMethod);

    // 4. 不在白名单 + 已登录：携带 Token
    if (!isWhiteList && userStore.token) {
      config.headers.Authorization = `Bearer ${userStore.token}`;
    }

    return config;
  },
  (error) => Promise.reject(error)
);

// 响应拦截器（保持不变，处理 Token 过期、错误提示）
service.interceptors.response.use(
  (response) => response.data,
  async (error) => {
    const userStore = useUserStore();
    const originalRequest = error.config;

    // Token 过期处理（仅针对需要 Token 的接口）
    if (error.response?.status === 401 && !originalRequest._retry) {
      // 先判断原始请求是否在白名单（如果是白名单接口 401，可能是接口配置错误，直接抛出）
      const requestPath = originalRequest.url?.replace(originalRequest.baseURL || '', '') || '';
      const requestMethod = originalRequest.method?.toUpperCase() || 'GET';
      const isWhiteList = NO_TOKEN_WHITE_LIST[requestPath]?.includes(requestMethod);

      if (isWhiteList) {
        ElMessage.error('接口配置错误：公开接口返回 401');
        return Promise.reject(error);
      }

      // 非白名单接口 401：自动刷新 Token 并重发
      originalRequest._retry = true;
      try {
        const newToken = await userStore.refreshTokenAction();
        originalRequest.headers.Authorization = `Bearer ${newToken}`;
        return service(originalRequest);
      } catch (refreshError) {
        return Promise.reject(refreshError);
      }
    }

    const errorMsg = error.response?.data?.message || '请求失败，请重试';
    ElMessage.error(errorMsg);
    return Promise.reject(error);
  }
);

export default service;